Pinvon's Blog

所见, 所闻, 所思, 所想

精通比特币读书笔记--0

介绍

什么是比特币

比特币是构成数字货币生态系统基础的概念和技术的集合. 它代表了密码学和分布式系统研究的高潮, 有四个创新点:

  • A decentralized peer-to-peer network(这边我使用原文, 而非中文版的去中心化对等网络, decentralized 只表明不是单中心模式, 可能是中文版的去中心, 也有可能是多中心)
  • 公共交易账本(区块链)
  • 独立交易确认和货币发行的一套规则(共识)
  • 所有用户都承认的将新区块写入链的机制(工作量证明)

要成为数字货币, 需要解决三个基本问题:

  • 如何证明数字货币的真实性
  • 如何解决双重支付
  • 如何证明数字货币的所有者

这三个问题, 可以通过密码学来解决. 加密数字签名使用户能够签署数字资产或证明该资产所有权的交易, 数字签名可以解决双重支付问题.

比特币使用工作量证明算法, 每 10 分钟进行一次全球性的"选举", 从而允许分布式网络达成关于交易状态的共识, 这也解决了双重支付问题.

钱包

私钥: 一个随机数, 通过计算机算法生成(密码学安全的随机数生成器).

公钥: 有了私钥后, 可以计算公钥(反过来则不成立).

地址: 比特币程序加上校验码(公钥哈希)进行两次 sha256 后, 取前 4B 和比特币主网版本号(0x00), 形成最终地址.

钱包: 地址及对应私钥的管理工具(可以管理多个地址多个私钥).

我们可以使用比特币钱包来随机生成一个私钥及对应的比特币地址. 但如果未参与交易, 这个比特币地址并不为比特币网络所知.

B 是一个新用户, 其比特币地址现在还不为比特币网络所知.

A 给 B 转账: A 的钱包构造一个交易, 并用 A 的私钥为交易签名, 然后将比特币从 A 的比特币地址转向 B 的比特币地址. 这个交易会被传播到比特币网络, 网络中的其他节点收到交易后, 认识了 B 的比特币地址.

B 的钱包会周期性查询比特币网络上的交易. 如果钱包发现交易中有地址与钱包中的地址匹配, 就会显示正确接收比特币. 但是现在, 这个交易还处于"未确认"状态, 要成为"确认"状态, 需要将交易写入区块链, 这会每 10 分钟写入一次.

写入区块链后, 这些比特币就为 B 所有了.

比特币原理

比特币概述

比特币系统由用户, 交易和矿工组成.

用户: 通过密钥控制钱包.

交易: 每一笔交易都会被广播到整个比特币网络.

矿工: 通过竞争计算生成在每个节点达成共识的区块链, 区块链是一个分布式的公共账本, 包含了比特币网络发生的所有交易.

交易

交易告诉全网: 比特币的持有者已授权把比特币转账给其他人. 接收者可以再次授权, 将比特币转给其他用户.

交易输入输出

交易包含一个或多个输入, 也包含一个或多个输出. 输入不一定要等于输出. 如果输出略小于输入, 中间的差值表示矿工费, 由矿工收取. 如图所示:

74.png

交易链

75.png

从图中可以看出:

Joe --(0.1BTC)--> Alice, 因为输出地址是 Alice's Address, 所以如果没有 Alice 的私钥, 是无法取出里面的 BTC 的.

Alice --(0.015BTC)--> Bob, Alice 通过私钥打开 Alice's Address, 这样可以向全网证明, 自己的确拥有这笔钱.

注意, 这里的地址非常重要, 你如何向别人证明这钱是你的? 因为只有你的私钥能打开这地址.

上一笔交易的输出, 会成为下一笔交易的输入, 由此形成了一条交易链.

思考: 说明如果收到了多笔比特币, 在钱包里显示的是总和, 但是要花出去时, 并不是将这个总和作为输入. 比如账户里收到了两笔 10BTC, 要转账 15BTC, 并不是将 20BTC 作为一个整体来输入, 也不是从 20BTC 中拿出 15BTC 来作为输入, 而是产生两个输入, 每个输入是上次的输出, 即两个 10BTC, 然后产生两个输出, 一个输出是接收者的 15BTC, 还有一个输出是自己的 4.xBTC(相当于找钱), 然后中间少了 0.xBTC, 是作为矿工费, 被矿工收取了.

找零

关于找零, 上面的思考部分也提到了, 跟现实的找零是一样的. 但是找零的地址, 可以不用与输入时提供的地址相同. 出于隐私, 许多人会把钱包中的另一个地址作为找零地址.

也许有些钱包可以将输入进行汇总, 以匹配刚好所需的输出. 如果没有这种钱包, 并且如果只使用最大的面额, 最后会得到许多零钱, 如果只使用零钱, 最后会得到整钱.

不管怎样, 一笔交易的输出可以被当成另一笔交易的输入, 这样随着钱从一个地址移动到另一个地址的同时, 形成了一条所有权链.

常见的交易形式

一个输入, 多个输出: 如找零, 如发工资

多个输入, 一个输出: 用零钱凑满一次转账. 这种情况的发生, 一般是钱包里有太多的小额 BTC 了, 钱包通过这种方式来清理小额 BTC.

交易的构建

用户需要做的事, 应该尽可能简单, 所以如何选取合适的输入, 应由钱包在后台完成, 用户只需要输出目标地址和金额即可.

获取正确的输入

钱包会跟踪钱包中某个地址的所有可用的(上一次交易的)输出. 完整的客户端会包括整个区块链中所有可用的输出, 但这会占用太大的硬盘空间, 所以钱包一般只保存钱包中的地址的可用输出.

如果钱包中连自己的地址的可用输出都没有保存, 则可以使用 API, 从比特币网络中获取这一信息, 所需的参数主要就是自己的地址. 这样就可以知道自己有哪些钱可以作为下一次交易的输入了.

创建交易的输出

交易的输出会被创建成一个包含这笔数额的脚本的形式, 这个脚本说, "谁的签名能和 Bob 的公开地址匹配, 这笔钱就给谁". 由于只有通过 Bob 的私钥进行签名, 才能与这个地址匹配, 所以, 只有 Bob 的钱包可以提供这个签名, 以兑换这笔输出. 因此, Alice 还需要 Bob 的签名, 来包装这个输出.

另外, 输出还有可能包含自己的找零地址, 以及矿工费. 矿工费的作用是让这笔交易尽快被处理.

将交易放入账本

比特币网络

比特币网络是许多比特币客户端组成的 P2P 网络. 比特币网络的目的是将交易和区块传播给所有参与者.

交易的传播

Alice 的钱包应用可以发送新的交易给其他任意一个已连接到互联网的比特币客户端, Alice 的钱包不必直接连着 Bob 的钱包. 任何比特币网络的节点在收到一个之前没有见过的有效交易时, 会立刻将它转发给与自身直接相连的其他节点. 所以, 这个交易会迅速从 P2P 网络中传播开来, 几秒内就能到达大多数节点.

接收者

Bob 可以很快确认 Alice 的交易, 因为交易中包含只能用 Bob 的私钥兑换的输出.

由于 Alice 的地址是公开的, 该交易是否正确构建(主要是验证 Alice 的输入是未消费的), 可以很容易被 Bob 验证. 比如, Bob 可以将 Alice 的地址作为参数, 使用 API 查询其未消费输入.

挖矿

挖矿可以验证交易, 然后将交易加入区块. 多个交易被打包放到区块中, 需要极大的计算量来证明, 但只需要少量的计算就能验证其已被证明.

挖矿在构建区块时会创造新的 BTC, 每个区块创造的 BTC 数量固定, 随时间逐渐减少.

如果一个矿工正确验证了所有的交易, 并且完成了工作量证明, 则可以获得这些交易的矿工费和构建区块时创建的新 BTC.

区块中的挖矿交易记录

新交易会不断从用户钱包或其他应用流入比特币网络, 比特币网络中的节点看到这些交易后, 会先将它们放到各自节点维护的一个临时的未经验证的交易池中. 当矿工构建一个新区块时, 会将这些交易从交易池中取出, 放到新区块中, 然后通过工作量证明, 来证明这个新区块的合法性.

每个矿工会在他的区块中包含一个特殊的交易, 将新生成的 BTC 和矿工费作为报酬支付到自己的地址中.

交易会以矿工费的高低来排序(可能还有一些其他规则), 矿工费高的区块将优先被处理.

如果一个区块后面又链了六个区块, 则这个区块就被认为是不可撤销的了, 因为要撤销和重建六个区块需要巨量的计算.

消费一笔交易

如果交易已经成为区块的一部分, 加到了区块链上, 则它就全网可见, 每个比特币客户端都可以独立验证这笔交易是有效且可消费的. 全网都可以追溯钱款的来源. 如果一个交易在区块链中, 且它后面有几个新区块, 轻量级客户端(钱包)就认为这个支付是合法的.

Comments

使用 Disqus 评论
comments powered by Disqus